14. 引用
引用
你是否知道,每次调用函数时,输入变量都会复制到内存中?要证明这一点,可以使用以下代码:
#include <iostream>
#include <vector>
using namespace std;
//函数声明,打印出矩阵在内存中的地址
void matrix_address(vector< vector<int> > my_matrix);
int main() {
//初始化矩阵
vector< vector<int> > matrix(5, vector<int>(6,2));
//打印出矩阵地址
cout << "original variable address: " << &matrix << "\n";
//运行一个函数,打印出矩阵地址
matrix_address(matrix);
return 0;
}
//打印出矩阵地址的函数
void matrix_address(vector< vector<int> > my_matrix) {
cout << "function variable address: " << &my_matrix << "\n";
}
运行这段代码时,你会得到以下这种输出:
original variable address:0x7fff5fbff650
function variable address:0x7fff5fbff608
那么,这段代码的功能是什么?它在一个名为 matrix 的变量中,初始化了一个 5 乘以 6 的二维向量。然后,代码在内存中二维向量开始的地方打印出这个地址。
接下来,代码会调用一个函数,在函数的输入变量的内存中打印出地址。注意,尽管两个变量的值相同,地址并不一样。
这是因为,当你调用 matrix_address() 时,C++ 再次把二维向量复制到了内存中。
& 符号
在上面的代码中,你可能注意到了这个字符:&。
它给出了变量地址,而不是变量值。你还记得前一课中,我们简单学了点指针的内容吗?& 可以轻松地访问变量地址,不会不小心导致内存错误。
你也可以使用 & 提升代码速度!
& 如何提升代码速度
C++ 有几种基本的数据类型,如整数、字符和单精度浮点数,它们速度相对较快。对这些基本的数据类型,我们将要学习的编程策略可能没什么区别。但是,对于占用大量内存的变量,如阵列和向量,& 就会非常有用。
如果上面的 matrix_address 函数是这么定义的呢?
void matrix_address(vector< vector<int> >&my_matrix);
& 符号告诉编译器,根据引用传递输入变量。这表示,在函数内部,你使用的是原始变量,而不是其复制品。对于二维向量,你就可以省略很多读写。
此外,在某些情况下,你还可以直接修改输入向量,无需在函数内部创建一个新向量。例如,如果你准备在某个向量上进行标量乘法编程,而且又不需要保留原始向量,你就可以直接修改原始向量。在练习中,你会深入了解这一点是什么意思。
练习
在本练习中,你需要回顾前面学过的矩阵加法函数。你要重写一个代码版本,通过引用传递函数。我们看一下,这样能否让代码运行更快!